QuickSight と RDS を RDS Proxy 経由で繋げてみた
こんにちは、すながわです。
今回は、RDS for MySQL 8.0.39 と QuickSight を RDS Proxy 経由で接続してみます。
以下、構成のイメージです。プライベートサブネットにある RDS に接続します。
RDS および RDS Proxy の作成
以下構成で作成します。
- RDS for MySQL 8.0.39
- db.t3.micro
- プライベートサブネットに配置
- インスタンス作成時の画面で「RDS Proxy を作成」にチェックを入れる。(※ RDS Proxy はインスタンス作成後でも追加できるので、作成時にチェックを忘れた方はコンソールから適宜作成してください。)
EC2 作成
以下の構成で作成します。
- AL2023
- パブリックサブネットに配置
- 下記ブログを参考に、mysql クライアントコマンドが使えるようセットアップします。mysql --version できちんとバージョンが返ればOKです。
この EC2 を作成する理由は、RDS にログインしてデータベースやテーブルの作成などを行うためです。RDS へ接続できればいいので、今回は EC2 をパブリックサブネットに配置し、RDS への踏み台として利用しますが、他のやり方でも構いません。
QuickSight ENI 用 セキュリティグループ作成
QuickSight ENI 用のセキュリティグループを作成し、
RDS Proxy のセキュリティグループからの全ての TCP を許可するインバウンドルールを設定します。アウトバウンドルールはデフォルトのまま変えてないので画像は載せていません。
上記のようにインバウンドルールを追加する理由は、QuickSight 用の ENI にアタッチされたセキュリティグループの通信はステートフルじゃないためです。このような設定を入れないと、QuickSight から RDS Proxy への行きの通信はできても帰りの通信で弾かれてしまうため、結果として通信がうまくいきません。
詳細は以下ブログをご参照ください。
RDS Proxy のセキュリティグループ設定
以下のように、前述の QuickSight ENI 用セキュリティグループをソースとしたルールを追加します。
また、後ほど、EC2 から RDS Proxy 経由でログインしてデータベースを作成するので、EC2 のセキュリティグループをソースとしたルールも入れています。
RDS MySQL のセキュリティグループ設定
RDS Proxy からの接続を許可するようインバウンドルールを設定します。
EC2 からの許可ルールも入れていますが、これは必須では無いのでご放念ください。
RDS へログインし適当な DB を作成
パブリックの EC2 から RDS へログインします。
$ mysql -u <マスターユーザー名> -h <RDS Proxy エンドポイント> -p
ログインしたら、適当なデータベースおよびテーブルを作成します。これは後ほど、QuickSight から接続するデータベースになります。
mysql> CREATE DATABASE blog_db;
Query OK, 1 row affected (0.01 sec)
mysql> USE blog_db;
Database changed
mysql> SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| blog_db |
+------------+
1 row in set (0.00 sec)
mysql> CREATE TABLE user (id int, name varchar(10));
Query OK, 0 rows affected (0.03 sec)
mysql> SHOW tables;
+-------------------+
| Tables_in_blog_db |
+-------------------+
| user |
+-------------------+
1 row in set (0.00 sec)
mysql> INSERT INTO user values (1, 'Taro');
Query OK, 1 row affected (0.01 sec)
mysql> INSERT INTO user values (2, 'Hanako');
Query OK, 1 row affected (0.01 sec)
mysql> INSERT INTO user values (3, 'Jiro');
Query OK, 1 row affected (0.00 sec)
mysql> select * from user;
+------+--------+
| id | name |
+------+--------+
| 1 | Taro |
| 2 | Hanako |
| 3 | Jiro |
+------+--------+
3 rows in set (0.00 sec)
QuickSight 実行ロールの作成
以下の設定でロールを作成します。詳細は公式ドキュメントをご参照ください。
カスタム信頼ポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "quicksight.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
許可ポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:CreateNetworkInterface",
"ec2:ModifyNetworkInterfaceAttribute",
"ec2:DeleteNetworkInterface",
"ec2:DescribeSubnets",
"ec2:DescribeSecurityGroups"
],
"Resource": "*"
}
]
}
QuickSight アカウント設定メニューからVPC接続定義を作成
QuickSight ホーム画面 → 右上プロフィールアイコン → QuickSight を管理 → VPC 接続の管理 → VPC接続の追加 の順に選択します。その後以下のように設定し、画像下側の "追加" ボタンを選択。
- VPC接続名:<任意の名前>
- VPC ID:今回使用しているRDS が所属する VPC
- 実行ロール:前述の実行ロールを指定
- サブネット:1a と 1c のプライベートサブネットを指定
- セキュリティグループID:前述で作成済みの QuickSight ENI 用のセキュリティグループ ID
VPC 接続が作成されます。以下のようにステータスが AVAILABLE になれば OK です。
QuickSight データセットの作成
右上の "新しいデータセット" を選択します。
データセットの中から「MySQL」を選択します。「RDS」ではないところがポイントです。
データソースの設定は以下のようにします。ポイントはデータベースサーバーとして RDS Proxy のエンドポイントを指定する部分です。
- データソース名:<任意の名前>
- 接続タイプ:先ほど作成した VPC 接続を選択]
- データベースサーバー:<RDS Proxy のエンドポイント>
- ポート:3306
- データベース名:前述の項で作成したデータベース名
- ユーザー名:RDS のマスターユーザー名
- パスワード:マスターユーザーのログイン時のパスワード
- SSL の有効化:チェックを外す
完成形が以下画像です。画像左下のボタンは "接続を検証" するボタンなので、ボタンを押下して以下画像のように "検証済み" と表示されることを確認してください。確認できたら、右下の "データソースを作成" を選択します。
「RDS へログインし適当な DB を作成」の項目で作成した blog_db.user テーブルを表示できました。
終わりに
今回は、QuickSight から RDS Proxy に繋げるか試しました。
データセットで RDS を選ぶと RDS の DB 識別子しか選べないので、できないだろうなと思っていましたが、データソースを MySQL にすればできることがわかりました。
本記事がどなたかのお役に立てば幸いです。
参考文献